/************************************************************************************************************************************************
 *   Copyright (C) 2008 by Denjs                                                                                                                *
 *   dplsoft@pisem.net                                                                                                                          *
 *   http://qdroid.berlios.de                                                                                                                   *
 * -----------------------------------------------------------------------                                                                      *
 *   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or (at your option) any later version.                                      *
 *   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                                 *
 *   You should have received a copy of the GNU General Public License along with this program; if not, write to the                            *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------- *
 *     Эта программа является свободным программным обеспечением; вы можете распространять её и/или модифицировать в соответствии с лицензией   *
 *   GNU General Public License  (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU) версии 2.0 или более поздней - на ваш выбор.                         *
 *     Эта программа распространяется  в надежде что она будет вам полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, подразумеваемых или явных; без обещаний *
 *   полезности или применимости в конкретных условиях. Вы используете  данное ПО на свой страх и риск и сами полностью несете                  *
 *   ответственность за последствия. См. GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU).                                  *
 *     Вы должны получить копию GNU General Public License (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU)с данным ПО; Если этого не случилось,       *
 *   обратитесь в Фонд Свободного Программного Обеспечения :                                                                                    *
 *   Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.                                                  *
 * -------------------------------------------------------------------------------------------------------------------------------------------  *
 * Замечания для территории России: в соответствии с ГК РФ часть 4, начиная использовать данную программу (исполняемые файлы или исходные       *
 * тексты) вы автоматически соглашаетесь с данной лицензией.
 * Текст лицензии GNU GPL v.2 приводится в файлах COPYING и COPYING.RUS.UTF8 (перевод)
 ************************************************************************************************************************************************/

/*  QDroid SHELL script interpreter */

/*

Правила именования элементов:

Имена созданных классов
	t_ClassName
	семантические части - с большой буквы, в начале "t_" - "тип"
Имена методов созданных классов
 	method_name
	семантические части - разделяя подчеркиванием с малой буквы всё
Имена Объектов программы
	ObjectName
	семантические части - с большой буквы
Имена файлов заголовков и самих классов
	t_ClassName.h
	t_ClassName.cpp
	т.е. в полном соответсвии с именем класса
*/

/*
TODO create отладчик QTScript скриптов. (с другой стороны - будет доступен в QT 4.5)
TODO create реализовать Хранитель настроек/или опции для зарегистрированного скрипта
TODO create GUI класс прогресс-бар
ok create разобраться с созданием новых объектов из классов определенных в QT
brake определить создание объектов в QtScript сделал по модели фабрика объектов (HiveQueen)
OK разобраться с определением функций в контексте QTscript

TODO нужна оболочка t_color ?
TODO нужна оболочка t_brush ?

TODO нужно окно запрома директории или файла (?)

TODO! при перезапуске скрипта надо-бы иметь механизм проверки - существуют-ли уже какие-либо переменные или нет.
	пример - ПЕРЕзапускаем скрипт, и он создает новые окошки, а старые - "отваливаются".
	т.е. они висят, но сигнал-слот связи разрываются.

TODO! настройка/сохранение параметров скрипта до его запуска.
TODO! Поддержка русского в скриптах.

TODO print() -  ввести поддержку цвета сообщений.


TODO 2008.12.24 >-  Препроцессор (начаты работы). Сделать #include file.qsm
TODO 2008.12.25 >  доступ из скрипта к параметрам командной строки
			+ работа с именованными списками параметров
			 (2 стиля : varname=varvalue
			            -varname varvalue)
TODO 2008.12.25 >  запуск других скриптов с параметрами и получение возвращаемого результата.

*/
#include <QtCore>
#include <QCoreApplication>

#include <QtGui>
#include <QApplication>

#include <QtDebug>
#include <QtScript>

//#ifndef QT_NO_SCRIPTTOOLS
//#include <QtScriptTools>
//#include <QScriptEngineDebugger>
//#endif


//#include "./classes/t_QDroid.h"
//#include "./classes/t_DroidGui.h"

//#include "./classes/t_StartSender.h"
#include <t_StartSender.h>

//#include "./version.h"
#include <version.h>


/*========================================================================*/
/*========================================================================*/
/*========================================================================*/
/*========================================================================*/
int DebugLevel=0;
/* 1..5 
1 - only critical errors 
3 - control poins log

5 - full processed data dump
 */

//QDR::ссылки на функции
typedef qint32   (*TF_get_counter) (); //инициация по описанию ini-файла...
typedef QVariant (*TF_init_run) (QStringList );//инициация движка и запуск скрипта
typedef int     (*TF_init) ();//инициация фреймворка
typedef QString (*TF_setLogFile) (QString );//
typedef QObject *(*TF_getDroidHiveQueen) (); //
typedef QScriptEngine *(*TF_getQScriptEngine) (); //
typedef qint32  (*TF_set_argList) (QStringList); //установить спсиок параметров, который надо передать объекту
typedef bool (*TF_set_doQuitOnErrors)(bool);

//QDR::ссылки на функции (расш.функции работы со скриптами)
typedef QString (*TF_getVersion)();// вернуть строку описания версии libqdroid
typedef int (*TF_loadNewScript)(QString );//++2010.06.24 загрузить скрипт из файла
typedef QStringList (*TF_getLoadedScript)();//++2010.06.24 вернуть имя скрипта
typedef QScriptValue (*TF_runScript)(QStringList, QObject* );//++2010.06.24 выполнить скрипт
typedef QScriptValue (*TF_runScript_short)(QString, QObject* );//++2010.06.24 выполнить скрипт

/*========================================================================*/
/*========================================================================*/
//QDR::функции подгружаемой библиотеки
TF_get_counter	_get_counter;
TF_init_run           _init_run ;
TF_setLogFile	_setLogFile;
TF_init             _init_f;
TF_getQScriptEngine  _get_QScriptEngine; // вернуть ссылку на наше ядро улья
TF_getDroidHiveQueen  _get_DroidHiveQueen ; // вернуть ссылку на наше ядро улья
TF_set_argList	_set_argList;
TF_set_doQuitOnErrors _set_doQuitOnErrors;
TF_getVersion      _getVersion ;  //+part2
TF_loadNewScript   _loadNewScript ;
TF_getLoadedScript _getLoadedScript ;
TF_runScript       _runScript ;
TF_runScript_short _runScript_short ;
QString logFileFullName;
int debugLevel;

//QDR::
QLibrary *libQDroid=0;
QScriptEngine           *hiveQScriptEngine;
QObject                 *hiveQueen;//QDroid приведенный к QObject

//#if !defined(QT_NO_SCRIPTTOOLS)
//QScriptEngineDebugger   *hiveDebugger;
//#endif

//-------------------------------------------------------------------------------------------------
//loadQDroid(scriptArgList); //загрузим библиотеку.

// НО! выполнять скрипт будет только после сигнала t_dispatcher::afterStart()
// потому что думается eventLoop очень желателен.

//QDR::
int qdr_loadQDroid()
{

    if (libQDroid!=0)
        {
            qDebug() <<"t_dispatcher::qdr_loadQDroid()[00341] :: ERROR: I WILL NOL LOAD QDroid ONE MORE!: Framework Is Already Loaded!";
            return -1;
        };

    //QLibrary lib;
    libQDroid = new QLibrary();

    const QString libdirname=".";

    #if defined (Q_WS_X11)
        // Linux:
        const QString libfilename="qdroid";//LINUX::только имя - без префикса (lib~) и расширения или суффикса "~.so", "~.dll"

    #elif defined (Q_WS_WIN)
        // Win:
        const QString libfilename="libqdroid";//WIN:: имя - c префиксом (lib~) но без расширения или суффикса "~.so", "~.dll"

    #elif defined (Q_WS_MAC)
        // Mac:
        // NOT SUPPORTED THIS VERSION
    #else
        // NOT SUPPORTED THIS VERSION
    #endif

    if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0107] (I)";

    // ++2010

    //"поднамилежащие" системы в suse отдают почему-то русское сообщение и присем в UTF...
    // приходится декодировать обратно то что рассматривается как latin1 хотя на самом деле utf8
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec *codec = QTextCodec::codecForName("ISO 8859-1");

    QString fname = QString(""+QApplication::applicationDirPath()+"/"+libdirname+"/"+libfilename);

    libQDroid->setFileName(fname);
    libQDroid->setLoadHints(QLibrary::ExportExternalSymbolsHint|QLibrary::ResolveAllSymbolsHint);

    //lbl.append(QString("[0077]: application dir: ["+QApplication::applicationDirPath()+"] \n"));

    if (DebugLevel>=4) qDebug() << QString("loadQDroidAndRunScript()[0124]:: application dir: ["+QApplication::applicationDirPath()+"] \n");

    if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0126]:: (II)";

    // тут скорее всего выдадим отрицательный результат...
    if (! libQDroid->isLibrary(libQDroid->fileName()))
        {
             //lbl.append(QString("loadQDroidAndRunScript()[0130]: <<lib "+libQDroid->fileName()+" NOT a library::"+QString(codec->fromUnicode(libQDroid->errorString()))+">> \n"));
            if (DebugLevel>=4) qDebug()<< QString("loadQDroidAndRunScript()[0131]: <<lib "+libQDroid->fileName()+" NOT a library::"+QString(codec->fromUnicode(libQDroid->errorString()))+">> \n");
        }
       else
        {
             //lbl.append(QString("loadQDroidAndRunScript()[0135]: <<lib "+libQDroid->fileName()+" FOUND as a library::"+QString(codec->fromUnicode(libQDroid->errorString()))+">> \n"));
            if (DebugLevel>=4) qDebug()<< QString("loadQDroidAndRunScript()[0136]: <<lib "+libQDroid->fileName()+" FOUND as a library::"+QString(codec->fromUnicode(libQDroid->errorString()))+ ">> \n");
        };

qDebug() << "loadQDroidAndRunScript()[0140]: (III)";


    // а тут уже будет подобрано релаьно существующее имя - и значение libQDroid->fileName() изменится.
    if (! libQDroid->load())
        {
             //lbl.append("loadQDroidAndRunScript()[0144]:: <<lib "+libQDroid->fileName()+" NOT loaded:: "+QString(codec->fromUnicode(libQDroid->errorString()))+">> \n");
           if (DebugLevel>=4)  qDebug() << "loadQDroidAndRunScript()[0145]: <<lib " << libQDroid->fileName() << " NOT loaded:: " << QString(codec->fromUnicode(libQDroid->errorString())) << ">> \n";
        }
       else
        {
             //lbl.append("[0105]: <<lib "+libQDroid->fileName()+" Loaded:: "+QString(codec->fromUnicode(libQDroid->errorString()))+">>  \n");
            if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0150]: <<lib "  << libQDroid->fileName()  << " Loaded:: "  <<QString(codec->fromUnicode(libQDroid->errorString()))  << ">>  \n";
        };

qDebug() << "loadQDroidAndRunScript()[0154]: (IV)";

//;
    if (! libQDroid->isLoaded())
       {
              //lbl.append("[0114]: <<ERROR : lib not loaded:: "+libQDroid->errorString()+">>  \n");
              qDebug()  << "loadQDroidAndRunScript()[0159]: <<ERROR : lib not loaded:: "  << libQDroid->errorString()  << ">>  \n";
              return -1;
       }
      else
       {
              //lbl.append("[0119]: <<OK : lib loaded succesfull:: lib filename ["+libQDroid->fileName()+"]>>  \n");
            if (DebugLevel>=4) qDebug()  << "loadQDroidAndRunScript()[0164]: <<OK : lib loaded succesfull:: lib filename ["  << libQDroid->fileName() << "]>>  \n";
       };

    if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0168]: (V)";


// определим ссылки на наши функции
/*
    typedef qint32   (*TF_get_counter) (); //инициация по описанию ini-файла...
    typedef QVariant (*TF_init_run) (QStringList );//инициация движка и запуск скрипта
    typedef int     (*TF_init) ();//инициация фреймворка
    typedef QString (*TF_setLogFile) (QString );//
    typedef QObject *(*TF_getDroidHiveQueen) (); //
    typedef QScriptEngine *(*TF_getQScriptEngine) (); //
    typedef qint32  (*TF_set_argList) (QStringList); //установить спсиок параметров, который надо передать объекту
//*/
    if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0177]: (VI)";
/*/
    TF_get_counter	_get_counter 	= (TF_get_counter)(libQDroid->resolve("get_counter"));
    //TF_init_run         _init_run       = (TF_init_run)(libQDroid->resolve("init_run"));
    TF_setLogFile	_setLogFile 	= (TF_setLogFile)(libQDroid->resolve("setLogFile"));

    TF_init             _init_f            = (TF_init)(libQDroid->resolve("init"));
    TF_getQScriptEngine  _get_QScriptEngine = (TF_getQScriptEngine)(libQDroid->resolve("getQScriptEngine"));// (libQDroid->resolve("getDroidHiveQueen")); // вернуть ссылку на наше ядро улья
    TF_getDroidHiveQueen  _get_DroidHiveQueen = (TF_getDroidHiveQueen)(libQDroid->resolve("getDroidHiveQueen"));// (libQDroid->resolve("getDroidHiveQueen")); // вернуть ссылку на наше ядро улья
    TF_set_argList	_set_argList 	 = (TF_set_argList)(libQDroid->resolve("set_argList"));
//*/
    _get_counter 	= (TF_get_counter)(libQDroid->resolve("get_counter"));
    _init_run         = (TF_init_run)(libQDroid->resolve("init_run"));
    _setLogFile 	= (TF_setLogFile)(libQDroid->resolve("setLogFile"));
    _init_f               = (TF_init)(libQDroid->resolve("init"));
    _get_QScriptEngine  = (TF_getQScriptEngine)(libQDroid->resolve("getQScriptEngine"));// (libQDroid->resolve("getDroidHiveQueen")); // вернуть ссылку на наше ядро улья
    _get_DroidHiveQueen = (TF_getDroidHiveQueen)(libQDroid->resolve("getDroidHiveQueen"));// (libQDroid->resolve("getDroidHiveQueen")); // вернуть ссылку на наше ядро улья
    _set_argList 	= (TF_set_argList)(libQDroid->resolve("set_argList"));
    _set_doQuitOnErrors = (TF_set_doQuitOnErrors)(libQDroid->resolve("set_doQuitOnErrors"));

    _getVersion          = (TF_getVersion)(libQDroid->resolve("getVersion"));           // вернуть строку описания версии libqdroid
    _loadNewScript       = (TF_loadNewScript)(libQDroid->resolve("loadNewScript"));     //++2010.06.24 загрузить скрипт из файла
    _getLoadedScript     = (TF_getLoadedScript)(libQDroid->resolve("getLoadedScript")); //++2010.06.24 вернуть имя скрипта
    _runScript           = (TF_runScript)(libQDroid->resolve("runScript"));             //++2010.06.24 выполнить скрипт
    _runScript_short     = (TF_runScript_short)(libQDroid->resolve("runScript_short")); //++2010.06.24 выполнить скрипт

    if (DebugLevel>=4) qDebug() << "loadQDroidAndRunScript()[0177]: (VII)";

/**/ // от этого скоро будем отказываться в пользу окна сообщений и собственного перенаправления.
    if (_setLogFile)
        {
            //lbl.append("OK::<<function _setLogFile resolved>> ");
            if (debugLevel>=3) qDebug()<<"main.c::0165: OK... function _setLogFile resolved.";
            QString logFileFullName="", logFileName="libqdroid.app.log";
            logFileFullName=QApplication::applicationDirPath();
            logFileFullName.append("/").append(logFileName);

            if (DebugLevel>=4) qDebug()<< "loadQDroidAndRunScript()[0210]: _setLogFile()=" << _setLogFile(logFileFullName);

        }
            else
        {
            //lbl.append("ERROR::<<function _setLogFile not resolved>> \n");
            if (debugLevel>=1) qDebug()<<"loadQDroidAndRunScript()[0216]:: ERROR...function _setLogFile not resolved";
            return -1;
        };
/**/
    if (((_get_QScriptEngine) and (_init_f)) and (_set_argList))
        {
            //lbl.append("OK::<<function _get_QScriptEngine resolved>> ");
            if (debugLevel>=3) qDebug()<<"loadQDroidAndRunScript()[0194]: OK... function _get_QScriptEngine resolved.";

            _init_f();
            _set_doQuitOnErrors(false);
            _set_argList(QStringList());// список параметров передаем так. потмоу что запускать улей будем по простому сигналу без аргументов...
            //_set_argList(_scriptArgList);
            hiveQScriptEngine = _get_QScriptEngine();
            hiveQueen = _get_DroidHiveQueen();
            //QObject::connect(this,SIGNAL(qdr_startScript()),hiveQueen,SLOT(init()),Qt::QueuedConnection);

            ////qdroidHive_asQObj=_get_QScriptEngine();//_get_qdroidQueen();
            ////qdroidHive = qobject_cast<QScriptEngine *>(qdroidHive_asQObj) ;

        }
            else
        {
            //lbl.append("ERROR::<<function _get_QScriptEngine not resolved>> \n");
            if (debugLevel>=1) qDebug()<<"loadQDroidAndRunScript()[0200]:: ERROR...function _get_QScriptEngine not resolved";
            return -1;
        };



//	if (debugLevel>=1) qDebug()<<" ============= get_int_pp_0()="<<get_int_pp_0();
    if (_get_counter)
        {
            //lbl.append("OK::<<function get_counter resolved>> ");
            if (debugLevel>=3) qDebug()<<"loadQDroidAndRunScript()[0205]: OK... function get_counter resolved.";

            //qDebug()<< "::: _get_counter()=" << _get_counter();
            //qDebug()<< "::: _get_counter()=" << _get_counter();
            //qDebug()<< "::: _get_counter()=" << _get_counter();
        }
            else
        {
            //lbl.append("ERROR::<<function _get_counter not resolved>> \n");
            if (debugLevel>=1) qDebug()<<"loadQDroidAndRunScript()[0215]: ERROR...function _get_counter not resolved";
            return -1;
        };

/*
    QStringList argList=_scriptArgList;// _app->arguments(); //TODO!!!
    if (_init_run)
        {
            if (debugLevel>=3) qDebug()<<"loadQDroidAndRunScript()[0221]: OK... function init_run resolved";
            //lbl.append("OK::<<function init_run resolved>> ");

            // так мы делали ранее. но такой способ думается мне лучше не использовать когда нет eventloop...
            // а в момент исполненияэтого кода его как раз нет.
            //qDebug()<< "loadQDroidAndRunScript()[0224]:_init_run(argList) =" << _init_run(argList);

            //lbl.append("<<send() return string:: "+QString::fromUtf16(_response_place)+">>  \n");
            //qDebug()  << "<<send() return string::  "  << QString::fromUtf16(_response_place)  << ">>  \n";
        }
            else
        {
            //lbl.append("ERROR::<<function init_run not resolved>> \n");
            if (debugLevel>=1) qDebug()<<"loadQDroidAndRunScript()[0232]:: ERROR... function init_run not resolved";
        };
//*/
    if (
                (_getVersion)
            and (_loadNewScript)
            and (_getLoadedScript)
            and (_runScript)
            and (_runScript_short)
        )
        {
            //lbl.append("OK::<<function get_counter resolved>> ");
            if (debugLevel>=4) qDebug()<<"loadQDroidAndRunScript()[0205]: OK... functions _getVersion,_loadNewScript,_getLoadedScript,_runScript,_runScript_short are resolved.";
            if (DebugLevel>=3) qDebug()<< " QDroid Library is loaded: version is: [" << _getVersion() << "]";
            //qDebug()<< "::: _get_counter()=" << _get_counter();
            //qDebug()<< "::: _get_counter()=" << _get_counter();
            //qDebug()<< "::: _get_counter()=" << _get_counter();
        }
            else
        {
            //lbl.append("ERROR::<<function _get_counter not resolved>> \n");
            //if (debugLevel>=1) qDebug()<<"loadQDroidAndRunScript()[0215]: ERROR...function _get_counter not resolved";
            qDebug()<<"ERROR: loadQDroidAndRunScript()[0205]: ERROR...functions _getVersion,_loadNewScript,_getLoadedScript,_runScript,_runScript_short are not resolved.";
            return -1;
        };

    return 0;
} //int loadQDroidAndRunScript(QStringList _scriptArgList)


/*========================================================================*/
/*========================================================================*/
/*========================================================================*/
/*========================================================================*/
int main(int argc, char *argv[])
{

    //int retcode=0;
    t_StartSender *StartSender;
    //t_QDroid *DroidHiveQueen;
    QObject *DroidHiveQueen; //t_QDroid приведенный к QObject

    bool useGUI=false;
    #if defined(Q_OS_LINUX)
        //defined(Q_WS_X11)||
        // Linux:
        useGUI = getenv("DISPLAY") != 0;
        if (DebugLevel>=3) qDebug() << getenv("DISPLAY");
    #elif defined(Q_OS_WIN32)
        //defined(Q_WS_WIN)||
        // Win:
        useGUI = true; // пока будем считать, что под вендой нет вариантов когда графика недоступна.
    #elif defined (Q_WS_MAC)
        // Mac:
        // NOT SUPPORTED THIS VERSION
    #else
        // NOT SUPPORTED THIS VERSION
    #endif

    QApplication App(argc, argv, useGUI);

    if (DebugLevel>=3) qDebug() << "useGUI = " << useGUI;

    if (DebugLevel>=3) qDebug() << "main():[0011]:started!";
    if (DebugLevel>=3) qDebug() << "Have " << argc << "arguments at command line";

//TODO setCodecForCStrings <<-- по идее сюда надо засунуть кодировку консоли что бы понимать руские пути в файлах.
QStringList ArgList;
ArgList=App.arguments(); //++ 2009.09.05
//for (int q=0;q<argc;q++)
//пробежимся по списку опций
for (int q=0;q<ArgList.size();q++)
  {
    //ArgList.append(QString(argv[q]));

    //if (DebugLevel>=3)
            //qDebug() <<" arg"<<q<<" = ["<< ArgList.at(q) <<"]";

    //если находим некоторые указания - ихнадо выполнить сейчас
    // и выйти.
    if (ArgList.at(q)==QString("--version"))
       {
            qDebug() << "QDroid framework version "<< Version <<"\n";
            return 0;
       }
  }; /**/

//DroidHiveQueen = new t_QDroid(NULL);// это и есть наш диспетчер :)
//DroidHiveQueen->useGui = useGUI;
//DroidHiveQueen->platformVersion = Version;

    int loadRez=qdr_loadQDroid();
    //QDR::
    hiveQScriptEngine=0;
    DroidHiveQueen=0;
    //hiveDebugger=new QScriptEngineDebugger();
    //QDR::
    if (loadRez>=0)
        {
            //hiveQScriptEngine=;
            DroidHiveQueen=_get_DroidHiveQueen();
            hiveQScriptEngine=_get_QScriptEngine();
        }
      else
        {
          qDebug() << "ERROR! QDROID NOT LOADED! Scripts are not avalable!";
          return -1;
        };
    DroidHiveQueen->setProperty(QString("useGui").toLocal8Bit().constData(),QVariant(useGUI));
    DroidHiveQueen->setProperty(QString("platformVersion").toLocal8Bit().constData(),QVariant(Version));

// #if !defined(QT_NO_SCRIPTTOOLS)
//     hiveDebugger->attachTo(hiveQScriptEngine);
//     hiveDebugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); //при начале выплнения появится.
//     QMainWindow *debugWindow = hiveDebugger->standardWindow();
//     debugWindow->resize(1024, 640);
//     hiveDebugger->setAutoShowStandardWindow(true);
// #endif
/*
  here we will try to create an object to emit asincronius signal
  to QDroid object before event loop starting.
  That is all for start system-building inside activated event-loop.
  We needs normal event processing during initiation.

      "Собирать" систему нам нужно когда работает EventLoop.
      т.е. DroidHive->init() должен сработать уже после app.exec().
      Но app.exec() "засыпает" пока не выполнен app.exit() или app.quit().

      Для запуска иницииации внутри потока событий, создается объект-пустышка,
      он генерирует асинхронный сигнал на init() и после этого запускается поток событий.
      Сгенерированный сигнал будет доставлен с первым циклом работы event loop,
      и с его получением начнется инициация системы.
    */

    StartSender = new t_StartSender(NULL);
    QObject::connect(StartSender,SIGNAL(start_a(QStringList)),DroidHiveQueen,SLOT(init(QStringList)),Qt::QueuedConnection); // <<--- важно что бы сигнал отправился только с началом работы цикла обработки событий
    //QObject::connect(StartSender,SIGNAL(start_b()),DroidHiveQueen,SLOT(init2()),Qt::QueuedConnection);//testing one

    /* creating signal(s) to be delivered as soon as event loop starts */

    StartSender->send_start_a(ArgList);//arglist added 2008.12.25
    //StartSender->send_start_b(); //testing one

    if (DebugLevel>=3) qDebug() << "main():[0071]:Event Loop Started!";
    /*and for starting event loop*/
    return App.exec();

}
